package special_class;

/**
 * @author : niu niu
 * @version : 1.0.0
 * @date : 2022/9/20 21:07
 *      String 类：
 *          1.java中的String是引用数据类型
 *              关于字符串的对象创建方法：
 *                  a.通过字符串字面量直接赋值
 *                  b.通过构造方法产生对象
 *                  c.通过字符数组来产生对象
 *                  d.通过字符串的静态方法valueOf来产生对象
 *
 *          2.String 是引用数据类型，因此String str 只是保存了字符串对象的地址，字符串对象到底是如何进行保存的？
 *               private final char value[];  本质都是字符数组
 *               所有高级语言，字符串类型，本质都是字符数组，java使用类包装字符数组，提供内置方法，方便使用。
 *
 *               内存中，字符串对象在堆中开辟新空间存储，数值在 字符数组属性中存储
 *
 *          3.为什么 String被final修饰？
 *             String类被final修饰，不存在多态，保证JDK的使用者，String都是相同版本，使用的方法也都完全一致
 *
 *          4.方法：
 *                      .length() 获取字符串长度，其内部value是数组中保存字符的个数
 *                      .isEmpty() 判断当前字符串对象的长度是否为0
 *
 *          5.""括起来的是字符串字面量
 *
 *          6.两个字符串的比较：
 *              6.1 == 比较（地址比较，不看内容）
 *              6.2 通过equals 方法比较两个字符串的内容是否相等（大小写敏感）  返回值为boolean
 *              6.3 通过equalsIgnoreCase 方法比较两个字符串的内容是否相等（大小写不敏感） 返回值为boolean
 *              6.4 通过compareTo() 方法比较两个字符串对象大小,
 *                      a.首先按照两个字符串的字典序大小比较，若出现不相等的字符，直接返回这两个字符的大小差值(字符编码差值)
 *                      b.若前K个字符相等（k是最小共同长度），返回长度差
 *        //判断字符串是否为空的标准代码： String str = null;
 *                                      boolean ret = false;
 *                                      if(str == null || str.isEmpty()){
 *                                          ret = true;
 *                                      }
 *          7.字符串内容查找
 *              7.1 在字符串中查找指定的字符
 *                      char charAt(int index) 返回字符串中指定 索引index位置的字符
 *                      //JDk中包装类提供的判断 字符 是否是数字字符 Character.isDigit(c)
 *                      //从前往后找
 *                      int indexOf(int ch)  返回ch第一次出现的位置，没有返回-1
 *                      int indexOf(int ch, int fromIndex)  从fromIndex位置开始找ch第一次出现的位置，没有返回-1
 *                      int indexOf(String str)  返回str第一次出现的位置，没有返回-1
 *                      int indexOf(String str, int fromIndex)  从fromIndex位置开始找str第一次出现的位置，没有返回-1
 *                      //从后往前找
 *                      int lastIndexOf(int ch) 从后往前找，返回ch第一次出现的位置，没有返回-1
 *                      int lastIndexOf(int ch, int fromIndex)  从fromIndex位置开始找，从后往前找ch第一次出现的位置，没有返回-1
 *                      int lastIndexOf(String str) 从后往前找，返回str第一次出现的位置，没有返回-1
 *                      int lastIndexOf(String str, int fromIndex)  从fromIndex位置开始找，从后往前找str第一次出现的位置，没有返回-1
 *                      //是否包含
 *                      boolean contains(charSequence s)   判断字符串中是否有指定的子串，若有返回true，否则返回false（大小写敏感）
 *          8.字符串转化方法
 *                8.1 将其它类型转为字符串对象，可以接受所有参数，自定义类型时调用toString方法
 *                  valueOf(Object o);
 *                8.2 大小写转换（纯英文字符串）
 *                  toUpperCase();//大写
 *                  toLowerCase();//小写
 *                8.3 ★字符串转数组
 *                      8.3.1 转字符数组 toCharArray();
 *                      8.3.2 转字节数组 getBytes(传入指定的字符编码);
 *                8.4 格式化字符串
 *                      //类似于C的printf 但是支持 正则表达式
 *                      String.format("%d - %d - %d",2022,9,21);
 *         9. 字符串替换
 *              //替换所有的指定内容
 *              String replaceAll(String regex, String replacement)
 *                  regex 想要替换的内容  ， replacement 被替换的内容
 *              //替换首个内容
 *              String replaceFirst(String regex, String replacement)
 *         10. 字符串的拆分
 *              将一个字符串按照指定的格式拆分成指定的数组
 *              //将字符串全部拆分
 *              String[] split(String regex)
 *              //将字符串以指定的格式，拆分为limit组,前几个单独一组，最后不够的合为一组
 *              String[] split(String regex, int limit)
 *
 *              当调用split碰到某些特殊字符无法正确拆分时，使用转义字符（比如拆分 ip 地址）
 *                       ·字符"|","*","+"都得加上转义字符，前面加上 "\\" .
 *                       ·而如果是 "\" ，那么就得写成 "\\\\" .
 *                       ·如果一个字符串中有多个分隔符，可以用"|"作为连字符
 *         11. ★字符串的截取
 *              //从指定索引截取到结尾
 *              String substring(int beginIndex)
 *              //截取部分内容  从beginIndex 到 endIndex   区间都是 [)  保留开始，舍弃结束
 *              String substring(int beginIndex, int endIndex)
 *
 *         12.String trim()
 *               去掉字符串中的左右空格,保留中间空格
 *
 *
 *
 */
public class StringDemo {
    public static void main(String[] args) {
//        //通过字符串字面量直接赋值
//        String str = "hello String";
//        //通过构造方法产生对象
//        String str1 = new String("hello String");
//        //通过字符数组来产生对象
//        char[] arr = new char[]{'h','e','2'};
//        String str2 = new String(arr);
//        //通过字符串的静态方法valueOf来产生对象
//        String str3 = String.valueOf("hello String");
//        System.out.println(str);
//        System.out.println(str1);
//        System.out.println(str2);
//        System.out.println(str3);
//        System.out.println("-------");
//
//        String str1 = "hello ";
//        String str2 = "java";
//        String str3 = str1;
//        System.out.println(str1.length());
//        System.out.println(str1.isEmpty());
//        String str = null;
//        //NullPointerException
//        System.out.println(str.length());

        //字符串查找部分：
        String  str = "Hello world";
        //所有和索引相关的方法调用一定要注意是否越界的问题
        char c = str.charAt(4);
        System.out.println(c);
        System.out.println(isDigit("1234"));
        System.out.println(isDigit("a234"));
        System.out.println(isDigit("1234a"));
        System.out.println(isDigit(null));
        System.out.println(isDigit(""));


    }
    //判断str是否由纯数字组成
    public static boolean isDigit(String str){
        //1.边界条件，字符串为null,或者内容为空
        if(str==null||str.length()==0){
            return false;
        }
        //2.需要将字符串拆分为一个个字符判断
        for (int i = 0; i <str.length(); i++) {
            char c = str.charAt(i);
//            if (c<'0'||c>'9'){
//                return false;
//            }

            //JDk中包装类提供的判断字符是否是数字字符
            if(!Character.isDigit(c)){
                return false;
            }
        }
        //走完整个循环还是没有反例，则是出数字
        return true;
    }
}
